# 项目名称
TARGET = main

# 源码和头文件路径
SRC_DIR = src
INCLUDE_DIR = include
BUILD_DIR = build
BIN_DIR = bin
DATA_DIR = data

# 所有源文件
SRCS = $(SRC_DIR)/main.cpp \
       $(SRC_DIR)/student/Student.cpp 

# 对应的目标文件（.o）
OBJS = $(patsubst $(SRC_DIR)/%.cpp, $(BUILD_DIR)/%.o, $(SRCS))

# C++ 标准与编译器标志
CXX = g++
CXXFLAGS = -Wall -Wextra -std=c++17 -I$(INCLUDE_DIR)

# 默认目标
all: dirs $(BIN_DIR)/$(TARGET).exe

# 创建 build 和 bin 目录（包括子目录）
dirs:
	@for %%d in ($(sort $(dir $(OBJS)))) do @if not exist "%%d" mkdir "%%d"
	@if not exist "$(BIN_DIR)" mkdir "$(BIN_DIR)"

# 将 .cpp 编译成 .o
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

# 链接所有 .o 文件生成最终可执行文件
$(BIN_DIR)/$(TARGET).exe: $(OBJS)
	$(CXX) $(CXXFLAGS) $^ -o $@

# 清理构建产物
clean:
	@echo Cleaning build and bin directories...
	@del /q $(BUILD_DIR)\*.* 2>nul
	@del /q $(BIN_DIR)\*.* 2>nul

# 运行程序
run: $(BIN_DIR)/$(TARGET).exe
	.\$(BIN_DIR)\$(TARGET).exe

.PHONY: all clean run dirs